<?php
namespace Home\Controller;

/***
 * 员工站内信功能的控制器
 * @author Cifang
 *
 */
class MsgController extends CommonController {
    //查找站内信（全部、未读、按指定条件等）
    public function internalMsg(){
        //获取session中存储的当前登录用户的id，据此来查询相关的信息（发送和接收）
        $uid = session('id');    
        //视图模型
        $msgConn = D('InternalMsgView');
        
        //请求传参如下
        //		_dc:1460457438387
        //		keyword:收到
        //		searchType:4
        //		stime:2016-04-10T00:00:00
        //		etime:2016-04-13T00:00:00
        //		msgType:1//全部，0表示未读
        //		page:1
        //		start:0
        //		limit:8
        //		sort:[{"property":"sendtime","direction":"ASC"}]
        
        //sql条件
        $where = array();
        
        //如果有toname:'me'，表示仅获取当前登录用户作为收信人的信息
        if (I('get.toname', '') != 'me'){
            $where['message.fromuid'] = $uid;
        }
        $where['message.touid'] = $uid;
        $where['_logic'] = 'OR';
        $map['_complex'] = $where;
        $map['message.del'] = '0';
        
        //时间段
        if (I('get.stime') && I('get.etime')) $map['sendTime'] = array('between', strtotime(I('get.stime')) .','. strtotime(I('get.etime')));
        //只有开始时间
        if (I('get.stime') && !I('get.etime', '0')) $map['sendTime'] = array('EGT', strtotime(I('get.stime')));
        //只有结束时间
        if (I('get.etime') && !I('get.stime', '0')) $map['sendTime'] = array('ELT', strtotime(I('get.etime')));
        //全部还是未读，为1时不需要任何操作，为0时则status=0
        if (I('get.msgType', '-1') == 0) $map['status'] = '0';
        
        if(I('get.keyword')){
            switch (I('get.searchType')){
                case 1:
                    //按标题
                    $map['title'] = array('like', '%'. I('get.keyword') .'%');
                    break;
                case 2:
                    //按内容
                    $map['content'] = array('like', '%'. I('get.keyword') .'%');
                    break;
                case 3:
                    //按发信人
                    // 我是aa。发信人a、aa、aaa、b、bb、bbb，收信人a、aa、aaa、b、bb、bbb。不能显示别人之间的信息。
                    // 当按发信人"a"进行搜索，会查找3个发信人，当为我自己时，收信人一定不是我；当不为我时，收信人一定要是我。
                    $this->_case3And4($uid, $where, $map);
                    break;
                case 4:
                    //按收信人 
                    $this->_case3And4($uid, $where, $map, false);                    
                    break;
            }
        }
        //总数，前台分页用
        $data['total'] = $msgConn->where($map)->count();        

        //当按时间进行升序、降序排序时传参：sort: [{"property":"sendtime","direction":"DESC/ASC"}]
        if (I('get.sort')){
            $sort = json_decode(I('get.sort', '', ''), true);
            $order = 'sendTime '. $sort[0]['direction'];
        }else{
            $order = 'sendTime DESC';
        }
        
        $data['data'] = $msgConn->where($map)->order($order)->limit(I('get.start') .','. I('get.limit'))->select();        
        
        //虽然在数据表中字段名称sendTime，但是返回的结果中是sendtime，并没有大写t。
        //所以extjs中的store和view中需要注意这点。不然没有值。
        foreach ($data['data'] as $k=>$v){
            $data['data'][$k]['sendtime'] = date('Y-m-d H:i:s', $v['sendtime']);
        }
        $this->ajaxReturn($data);
    }
    
    //控制器内使用，private
    //把internalMsg中case 3和4的代码独立出来
    //$from true表示按收信人，若为false表示按收信人
    private function _case3And4($uid, &$where, &$map, $from = true){
        //由于按发信人和收信人查询情况有些特殊，调用此方法之前的$where数组已有查询条件不再适用，所以先清空该数组，再进行重新设置
        $where = array();
        //按发信人
        //页面传来的可能只是用户名的一部分，这就需要查找所有满足条件的用户id，在message中使用fromuid in(...) 来进行查找信息
        $ids = M('user')->field('id')->where(array('username' => array('like', '%'. I('get.keyword') .'%')))->select();
        foreach ($ids as $v){
            $idArr[] = $v['id'];
        }
         
        //当前用户id在$idArr数组中
        if(in_array($uid, $idArr)){
            if(count($idArr) == 1){
                //说明只有一个，就是当前用户
                //如果$from为true表示按发信人
                if ($from){
                    $map['message.fromuid'] = $uid;
                }else{
                    $map['message.touid'] = $uid;
                }
            }else{
                //分两种情况进行查找
                //先把当前用户id从数组中删除
                for ($i=0; $i<count($idArr); $i++){
                    if($idArr[$i] == $uid){
                        array_splice($idArr, $i, 1);
                    }
                }
                //发信人
                if ($from){
                    //情况1，发信人不是当前用户，收信人一定要是当前用户
                    $where['message.fromuid'] = array('in', $idArr);
                    $where['message.touid'] = $uid;
                    $map1['_complex'] = $where;
                    $map1['_logic'] = 'OR';
                    //情况2，发信人就是当前用户
                    $map1['message.fromuid'] = $uid;
                    $map['_complex'] = $map1;
                }else{
                    //收信人
                    //情况1，收信人不是当前用户，发信人一定要是当前用户
                    $where['message.fromuid'] = $uid;
                    $where['message.touid'] = array('in', $idArr);
                    $map1['_complex'] = $where;
                    $map1['_logic'] = 'OR';
                    //情况2，收信人就是当前用户
                    $map1['message.touid'] = $uid;
                    $map['_complex'] = $map1;
                }                
            }
        }else{
            //发信人
            if ($from){
                //当前用户id不在发信人id数组中，收信人就必须是当前用户
                $where['message.fromuid'] = array('in', $idArr);
                $where['message.touid'] = $uid;
                $map['_complex'] = $where;
            }else{
                //收信人
                //当前用户id不在收信人id数组中，发信人就必须是当前用户
                $map['message.fromuid'] = $uid;
                $map['message.touid'] = array('in', $idArr);
            }
            
        }
    }    
    
    //用户查看某个具体的站内信
    public function checkContent(){
        //ajax请求会传递该站内信的id
        $messageConn = M('message');
        //查看该站内信是否已读
        $status = $messageConn->where('id='. I('post.id'))->getField('status');

        //已读，直接取内容
        if ($status == 1){            
            $data['content'] = $messageConn->where('id='. I('post.id'))->getField('content');
            $this->ajaxReturn($data);
        }else{
            //未读
            //I('post.id')就是信息的id，根据这个id找到touid
            $touid = $messageConn->where('id='. I('post.id'))->getField('touid');
            //如果touid为自己的id，表示自己是收信人，标记为已读
            if ($touid == session('id')){
                //更新本信息状态
                if (!!$messageConn->where('id='. I('post.id'))->save(array('status'=>'1'))){
                    $data['content'] = $messageConn->where('id='. I('post.id'))->getField('content');
                    $this->ajaxReturn($data);
                }else{
                    //如果状态设置失败
                    $this->ajaxReturn(array('msg'=>'更新信息状态失败，请联系管理员~'));
                }
            }else{
            	//收信人不是当前登录用户，直接读取内容，状态不变
                $data['content'] = $messageConn->where('id='. I('post.id'))->getField('content');
                $this->ajaxReturn($data);
            }
        }              
    }
    
    //用户发送、回复站内信
    public function replyMsg(){
        //如果是发送信息，会传递过来收信人的id（因为是通过comboBox来选择收信人的）
        if (I('post.touid')){
            if(!!intval(I('post.touid'))) {
                $data['touid'] = I('post.touid');
            }else{
            	//如果没有传递收信人id
                $this->ajaxReturn(array('success' => false, 'msg' => '请选择一个收信人~'));
            }
        }else{
        	//这里是直接回复站内信
        	//根据收信人查找其用户id
            $data['touid'] = M('user')->where('username="'. I('post.toname') .'"')->getField('id');
        }
        
        $data['title'] = I('post.title');
        $data['content'] = I('post.content');
        $data['sendTime'] = time();
        $data['fromuid'] = session('id');
        
        if(M('message')->add($data)){
            $this->ajaxReturn(array('success' => true, 'msg' => '发送成功~'));
        }else{
            $this->ajaxReturn(array('success' => false, 'msg' => '发送失败，请重试或者联系管理员~'));
        }
    }
    
    //发送站内信时，把所有用户名，以comboBox的分页形式，显示在页面上，供选择发给谁
    public function internalMsgSend(){
        $userConn = M('user');
        $data['total'] = $userConn->count();
        //neq，表示不把自己显示在列表中
        $data['data'] = $userConn->field(array('id', 'username'))->where(array('id' => array('neq', session('id'))))->select();
        $this->ajaxReturn($data);
    }
    
    //删除站内信（单个或者批量）
    public function  removeMsg(){
        $data['del'] = '1';
        if (M('message')->where(array('id' => array('in', I('post.ids', ''))))->save($data)){
            $this->ajaxReturn(array('status' => 'success', 'msg' => '删除成功~'));
        }else{
            $this->ajaxReturn(array('status' => 'failure', 'msg' => '删除失败，请重试或者联系管理员~'));
        }        
    }
}